home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Audio, Video & Photo / Songbird 0.7.0 / Songbird_0.7.0_windows-i686-msvc8.exe / components / sbFileDownloader.js < prev    next >
Text File  |  2008-08-06  |  15KB  |  468 lines

  1. /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* vim: set sw=2 :miv */
  3. /*
  4. //
  5. // BEGIN SONGBIRD GPL
  6. //
  7. // This file is part of the Songbird web player.
  8. //
  9. // Copyright(c) 2005-2008 POTI, Inc.
  10. // http://songbirdnest.com
  11. //
  12. // This file may be licensed under the terms of of the
  13. // GNU General Public License Version 2 (the "GPL").
  14. //
  15. // Software distributed under the License is distributed
  16. // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
  17. // express or implied. See the GPL for the specific language
  18. // governing rights and limitations.
  19. //
  20. // You should have received a copy of the GPL along with this
  21. // program. If not, go to http://www.gnu.org/licenses/gpl.html
  22. // or write to the Free Software Foundation, Inc.,
  23. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  24. //
  25. // END SONGBIRD GPL
  26. //
  27.  */
  28.  
  29. /**
  30.  * \file  sbFileDownloader.js
  31.  * \brief Javascript source for the file downloader component.
  32.  */
  33.  
  34. //------------------------------------------------------------------------------
  35. //------------------------------------------------------------------------------
  36. //
  37. // File downloader component.
  38. //
  39. //   This component provides support for downloading files.
  40. //
  41. //------------------------------------------------------------------------------
  42. //------------------------------------------------------------------------------
  43.  
  44. //------------------------------------------------------------------------------
  45. //
  46. // File downloader imported services.
  47. //
  48. //------------------------------------------------------------------------------
  49.  
  50. // Component manager defs.
  51. if (typeof(Cc) == "undefined")
  52.   var Cc = Components.classes;
  53. if (typeof(Ci) == "undefined")
  54.   var Ci = Components.interfaces;
  55. if (typeof(Cr) == "undefined")
  56.   var Cr = Components.results;
  57. if (typeof(Cu) == "undefined")
  58.   var Cu = Components.utils;
  59.  
  60. // Songbird imports.
  61. Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
  62.  
  63.  
  64. //------------------------------------------------------------------------------
  65. //
  66. // File downloader configuration.
  67. //
  68. //------------------------------------------------------------------------------
  69.  
  70. //
  71. // classDescription             Description of component class.
  72. // classID                      Component class ID.
  73. // contractID                   Component contract ID.
  74. // ifList                       List of external component interfaces.
  75. // _xpcom_categories            List of component categories.
  76. //
  77.  
  78. var sbFileDownloaderCfg= {
  79.   classDescription: "File Downloader",
  80.   classID: Components.ID("{f93a67e4-d97d-4607-971e-00ae2bf8ef8f}"),
  81.   contractID: "@songbirdnest.com/Songbird/FileDownloader;1",
  82.   ifList: [ Ci.sbIFileDownloader, Ci.nsIWebProgressListener ],
  83.   _xpcom_categories: []
  84. };
  85.  
  86.  
  87. //------------------------------------------------------------------------------
  88. //
  89. // File downloader object.
  90. //
  91. //------------------------------------------------------------------------------
  92.  
  93. /**
  94.  * Construct a file downloader object.
  95.  */
  96.  
  97. function sbFileDownloader() {
  98. }
  99.  
  100. // Define the object.
  101. sbFileDownloader.prototype = {
  102.   // Set the constructor.
  103.   constructor: sbFileDownloader,
  104.  
  105.   //
  106.   // File downloader component configuration fields.
  107.   //
  108.   //   classDescription         Description of component class.
  109.   //   classID                  Component class ID.
  110.   //   contractID               Component contract ID.
  111.   //   _xpcom_categories        List of component categories.
  112.   //
  113.  
  114.   classDescription: sbFileDownloaderCfg.classDescription,
  115.   classID: sbFileDownloaderCfg.classID,
  116.   contractID: sbFileDownloaderCfg.contractID,
  117.   _xpcom_categories: sbFileDownloaderCfg._xpcom_categories,
  118.  
  119.  
  120.   //
  121.   // File downloader fields.
  122.   //
  123.   //   _cfg                     Configuration settings.
  124.   //   _webBrowserPersist       Web browser persist object.
  125.   //
  126.  
  127.   _cfg: sbFileDownloaderCfg,
  128.   _webBrowserPersist: null,
  129.  
  130.  
  131.   //----------------------------------------------------------------------------
  132.   //
  133.   // File downloader sbIFileDownloader services.
  134.   //
  135.   //----------------------------------------------------------------------------
  136.  
  137.   /**
  138.    * \brief Number of bytes in file being downloaded.
  139.    */
  140.  
  141.   bytesToDownload: 0,
  142.  
  143.  
  144.   /**
  145.    * \brief Number of bytes in file that have been downloaded.
  146.    */
  147.  
  148.   bytesDownloaded: 0,
  149.  
  150.  
  151.   /**
  152.    * \brief Percentage (0-100) of bytes of file that have been downloaded.
  153.    */
  154.  
  155.   percentComplete: 0,
  156.  
  157.  
  158.   /**
  159.    * \brief True if file download has completed, whether successful or not.
  160.    */
  161.  
  162.   complete: false,
  163.  
  164.  
  165.   /**
  166.    * \brief True if file downloaded successfully.  Will be false if download is
  167.    *        cancelled.
  168.    */
  169.  
  170.   succeeded: false,
  171.  
  172.  
  173.   /**
  174.    * \brief Listener for download events.
  175.    */
  176.  
  177.   listener: null,
  178.  
  179.  
  180.   /**
  181.    * \brief URI of source of file.
  182.    */
  183.  
  184.   sourceURI: null,
  185.  
  186.  
  187.   /**
  188.    * \brief URI spec of source of file.
  189.    */
  190.  
  191.   sourceURISpec: null,
  192.  
  193.  
  194.   /**
  195.    * \brief Destination file.  If not set when download is started, a temporary
  196.    *        file will be created and set in destinationFile.
  197.    */
  198.  
  199.   destinationFile: null,
  200.  
  201.  
  202.   /**
  203.    * \brief Destination file extension.  If a temporary file is created, set its
  204.    *        file extension to destinationFileExtension.
  205.    */
  206.  
  207.   destinationFileExtension: null,
  208.  
  209.  
  210.   /**
  211.    * \brief Start file download from source URI to destination file.  If source
  212.    *        URI is not specified, use source URI spec.  If destination file is
  213.    *        not specified, create a temporary one.
  214.    */
  215.  
  216.   start: function sbFileDownloader_start() {
  217.     // Create a web browser persist object.
  218.     this._webBrowserPersist =
  219.            Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
  220.              .createInstance(Ci.nsIWebBrowserPersist);
  221.     this._webBrowserPersist.progressListener = this;
  222.     this._webBrowserPersist.persistFlags =
  223.            Ci.nsIWebBrowserPersist.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
  224.            Ci.nsIWebBrowserPersist.PERSIST_FLAGS_NO_CONVERSION |
  225.            Ci.nsIWebBrowserPersist.PERSIST_FLAGS_BYPASS_CACHE;
  226.  
  227.     // If source URI is not provided, use source URI spec.
  228.     if (!this.sourceURI && this.sourceURISpec) {
  229.       var ioService = Cc["@mozilla.org/network/io-service;1"]
  230.                         .getService(Ci.nsIIOService);
  231.       this.sourceURI = ioService.newURI(this.sourceURISpec, null, null);
  232.     }
  233.  
  234.     // Throw an exception if no source is specified.
  235.     if (!this.sourceURI)
  236.       throw Cr.NS_ERROR_INVALID_ARG;
  237.  
  238.     // If destination file is not provided, create a temporary one.
  239.     //XXXeps if destination file is provided, should create a temporary one and
  240.     //XXXeps move to destination when complete.
  241.     if (!this.destinationFile) {
  242.       var temporaryFileService =
  243.             Cc["@songbirdnest.com/Songbird/TemporaryFileService;1"]
  244.               .getService(Ci.sbITemporaryFileService);
  245.       this.destinationFile =
  246.              temporaryFileService.createFile(Ci.nsIFile.NORMAL_FILE_TYPE,
  247.                                              null,
  248.                                              this.destinationFileExtension);
  249.     }
  250.  
  251.     // Start the file download.
  252.     this._webBrowserPersist.saveURI(this.sourceURI,
  253.                                     null,
  254.                                     null,
  255.                                     null,
  256.                                     null,
  257.                                     this.destinationFile);
  258.   },
  259.  
  260.  
  261.   /**
  262.    * \brief Cancel file download.
  263.    */
  264.  
  265.   cancel: function sbFileDownloader_cancel() {
  266.     // Cancel the file download.
  267.     this._webBrowserPersist.cancelSave();
  268.   },
  269.  
  270.  
  271.   //----------------------------------------------------------------------------
  272.   //
  273.   // File downloader nsIWebProgressListener services.
  274.   //
  275.   //----------------------------------------------------------------------------
  276.  
  277.   /**
  278.    * Notification indicating the state has changed for one of the requests
  279.    * associated with aWebProgress.
  280.    *
  281.    * @param aWebProgress
  282.    *        The nsIWebProgress instance that fired the notification
  283.    * @param aRequest
  284.    *        The nsIRequest that has changed state.
  285.    * @param aStateFlags
  286.    *        Flags indicating the new state.  This value is a combination of one
  287.    *        of the State Transition Flags and one or more of the State Type
  288.    *        Flags defined above.  Any undefined bits are reserved for future
  289.    *        use.
  290.    * @param aStatus
  291.    *        Error status code associated with the state change.  This parameter
  292.    *        should be ignored unless aStateFlags includes the STATE_STOP bit.
  293.    *        The status code indicates success or failure of the request
  294.    *        associated with the state change.  NOTE: aStatus may be a success
  295.    *        code even for server generated errors, such as the HTTP 404 error.
  296.    *        In such cases, the request itself should be queried for extended
  297.    *        error information (e.g., for HTTP requests see nsIHttpChannel).
  298.    */
  299.  
  300.   onStateChange: function sbFileDownloader_onStateChange(aWebProgress,
  301.                                                          aRequest,
  302.                                                          aStateFlags,
  303.                                                          aStatus) {
  304.     // Check for completion.
  305.     if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP) {
  306.       // Mark completion.
  307.       this.complete = true;
  308.  
  309.       // Mark success if aStatus is NS_OK.
  310.       if (aStatus == Cr.NS_OK)
  311.         this.succeeded = true;
  312.  
  313.       // Delete destination file on failure.
  314.       if (!this.succeeded) {
  315.         this.destinationFile.remove(false);
  316.         this.destinationFile = null;
  317.       }
  318.  
  319.       // Remove web browser persist listener reference to avoid a cycle.
  320.       this._webBrowserPersist.progressListener = null;
  321.  
  322.       // Call file download listener.
  323.       if (this.listener)
  324.         this.listener.onComplete();
  325.     }
  326.   },
  327.  
  328.  
  329.   /**
  330.    * Notification that the progress has changed for one of the requests
  331.    * associated with aWebProgress.  Progress totals are reset to zero when all
  332.    * requests in aWebProgress complete (corresponding to onStateChange being
  333.    * called with aStateFlags including the STATE_STOP and STATE_IS_WINDOW
  334.    * flags).
  335.    *
  336.    * @param aWebProgress
  337.    *        The nsIWebProgress instance that fired the notification.
  338.    * @param aRequest
  339.    *        The nsIRequest that has new progress.
  340.    * @param aCurSelfProgress
  341.    *        The current progress for aRequest.
  342.    * @param aMaxSelfProgress
  343.    *        The maximum progress for aRequest.
  344.    * @param aCurTotalProgress
  345.    *        The current progress for all requests associated with aWebProgress.
  346.    * @param aMaxTotalProgress
  347.    *        The total progress for all requests associated with aWebProgress.
  348.    *
  349.    * NOTE: If any progress value is unknown, or if its value would exceed the
  350.    * maximum value of type long, then its value is replaced with -1.
  351.    *
  352.    * NOTE: If the object also implements nsIWebProgressListener2 and the caller
  353.    * knows about that interface, this function will not be called. Instead,
  354.    * nsIWebProgressListener2::onProgressChange64 will be called.
  355.    */
  356.  
  357.   onProgressChange:
  358.     function sbFileDownloader_onProgressChange(aWebProgress,
  359.                                                aRequest,
  360.                                                aCurSelfProgress,
  361.                                                aMaxSelfProgress,
  362.                                                aCurTotalProgress,
  363.                                                aMaxTotalProgress) {
  364.     // Update the file download statistics.
  365.     this.bytesToDownload = aMaxSelfProgress;
  366.     this.bytesDownloaded = aCurSelfProgress;
  367.     this.percentComplete =
  368.            Math.floor((this.bytesDownloaded / this.bytesToDownload) * 100);
  369.  
  370.     // Call file download listener.
  371.     if (this.listener)
  372.       this.listener.onProgress();
  373.   },
  374.  
  375.  
  376.   /**
  377.    * Called when the location of the window being watched changes.  This is not
  378.    * when a load is requested, but rather once it is verified that the load is
  379.    * going to occur in the given window.  For instance, a load that starts in a
  380.    * window might send progress and status messages for the new site, but it
  381.    * will not send the onLocationChange until we are sure that we are loading
  382.    * this new page here.
  383.    *
  384.    * @param aWebProgress
  385.    *        The nsIWebProgress instance that fired the notification.
  386.    * @param aRequest
  387.    *        The associated nsIRequest.  This may be null in some cases.
  388.    * @param aLocation
  389.    *        The URI of the location that is being loaded.
  390.    */
  391.  
  392.   onLocationChange: function sbFileDownloader_onLocationChange(aWebProgress,
  393.                                                                aRequest,
  394.                                                                aLocation) {
  395.   },
  396.  
  397.  
  398.   /**
  399.    * Notification that the status of a request has changed.  The status message
  400.    * is intended to be displayed to the user (e.g., in the status bar of the
  401.    * browser).
  402.    *
  403.    * @param aWebProgress
  404.    *        The nsIWebProgress instance that fired the notification.
  405.    * @param aRequest
  406.    *        The nsIRequest that has new status.
  407.    * @param aStatus
  408.    *        This value is not an error code.  Instead, it is a numeric value
  409.    *        that indicates the current status of the request.  This interface
  410.    *        does not define the set of possible status codes.  NOTE: Some
  411.    *        status values are defined by nsITransport and nsISocketTransport.
  412.    * @param aMessage
  413.    *        Localized text corresponding to aStatus.
  414.    */
  415.  
  416.   onStatusChange: function sbFileDownloader_onStatusChange(aWebProgress,
  417.                                                            aRequest,
  418.                                                            aStatus,
  419.                                                            aMessage) {
  420.   },
  421.  
  422.  
  423.   /**
  424.    * Notification called for security progress.  This method will be called on
  425.    * security transitions (eg HTTP -> HTTPS, HTTPS -> HTTP, FOO -> HTTPS) and
  426.    * after document load completion.  It might also be called if an error
  427.    * occurs during network loading.
  428.    *
  429.    * @param aWebProgress
  430.    *        The nsIWebProgress instance that fired the notification.
  431.    * @param aRequest
  432.    *        The nsIRequest that has new security state.
  433.    * @param aState
  434.    *        A value composed of the Security State Flags and the Security
  435.    *        Strength Flags listed above.  Any undefined bits are reserved for
  436.    *        future use.
  437.    *
  438.    * NOTE: These notifications will only occur if a security package is
  439.    * installed.
  440.    */
  441.  
  442.   onSecurityChange: function sbFileDownloader_onSecurityChange(aWebProgress,
  443.                                                                aRequest,
  444.                                                                aState) {
  445.   },
  446.  
  447.  
  448.   //----------------------------------------------------------------------------
  449.   //
  450.   // File downloader nsISupports services.
  451.   //
  452.   //----------------------------------------------------------------------------
  453.  
  454.   QueryInterface: XPCOMUtils.generateQI(sbFileDownloaderCfg.ifList)
  455. };
  456.  
  457.  
  458. //------------------------------------------------------------------------------
  459. //
  460. // File downloader component services.
  461. //
  462. //------------------------------------------------------------------------------
  463.  
  464. function NSGetModule(compMgr, fileSpec) {
  465.   return XPCOMUtils.generateModule([sbFileDownloader]);
  466. }
  467.  
  468.